# -*- coding: utf-8 -*-

def index():
    form = SQLFORM.factory(Field('categoria_test_id', 'reference categorie_test', requires=IS_NULL_OR(IS_IN_DB(db, 'categorie_test.id', '%(categoria_test)s')), label=T("Categoria")),
                           Field('test_id', 'reference test', requires=IS_NULL_OR(IS_IN_DB(db, 'test.id', '%(test)s')), label=T("Test")),
                           Field('data_inizio', 'date', label=T("Data inizio")),
                           Field('data_fine', 'date', label=T("Data fine")))
    if form.accepts(request.vars, session):
        session.stat_categoria_test_id = form.vars.categoria_test_id
        session.stat_test_id = form.vars.test_id
        session.stat_data_inizio = form.vars.data_inizio
        session.stat_data_fine = form.vars.data_fine
    sum = db.punteggi.punteggio.sum()
    query = (db.punteggi.id>0)
    if session.stat_categoria_test_id:
        query &= (db.punteggi.categoria_test_id==session.stat_categoria_test_id)
    if session.stat_test_id:
        query &= (db.punteggi.test_id==session.stat_test_id)
    if session.stat_data_inizio:
        query &= (db.punteggi.data_ora>=session.stat_data_inizio)
    if session.stat_data_fine:
        query &= (db.punteggi.data_ora<=session.stat_data_fine)
    left = [db.auth_user.on(db.punteggi.auth_user_id==db.auth_user.id),
            db.categorie_test.on(db.punteggi.categoria_test_id==db.categorie_test.id),
            db.test.on(db.punteggi.test_id==db.test.id)]
    rows = db(query).select(db.auth_user.id,
                            db.auth_user.first_name,
                            db.auth_user.last_name,
                            db.test.test,
                            db.categorie_test.categoria_test,
                            sum,
                            left=left,
                            groupby=[db.auth_user.id,
                                     db.auth_user.first_name,
                                     db.auth_user.last_name,
                                     db.test.test,
                                     db.categorie_test.categoria_test],
                            orderby=(~sum))
    return locals()